package artid.com.arttogo.utils;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v4.app.NotificationCompat;
import android.widget.Toast;

import com.google.gson.Gson;


import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import artid.com.arttogo.R;
import artid.com.arttogo.bean.IBeaconBean;
import artid.com.arttogo.bean.iBeaconClass;
import artid.com.arttogo.service.DeviceScanActivity;

/**
 * 项目名称：BLE_IBeacon 类名称 ：ScanningDeviceUtils 类描述 ：扫描设备 创建人 ：耿卫斌 创建时间：2016-9-13
 * 上午10:08:23
 */
public class ScanningDeviceUtils {
    private static Context mContext;
    // 要判断的UUID
    private static final String UUID = "11111111-1111-1111-1111-111111111111";
    /**
     * 搜索BLE终端
     */
    private static BluetoothAdapter mBluetoothAdapter;
    // 判断是否扫描设备
    private static boolean mScanning;
    /**
     * Notification构造器
     */
    public static NotificationCompat.Builder mBuilder;
    /**
     * Notification管理
     */
    public static NotificationManager mNotificationManager;
    // 开启蓝牙，并扫描设备
    public static int notificationNum = 1;// 通知栏条数

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
    public static void openBluetooth(Context Context) {
        mContext = Context;
        // 判断蓝牙是否支持BLE
        if (!mContext.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_BLUETOOTH_LE)) {
            Toast.makeText(mContext, "该机型不支持BLE", Toast.LENGTH_SHORT).show();
            return;
        }
        // Initializes a Bluetooth adapter. For API level 18 and above, get a
        // reference to
        // BluetoothAdapter through BluetoothManager.
        final BluetoothManager bluetoothManager = (BluetoothManager) mContext
                .getSystemService(android.content.Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = bluetoothManager.getAdapter();

        // 判断是否支持蓝牙
        if (mBluetoothAdapter == null) {
            Toast.makeText(mContext, "该机型不支持蓝牙", Toast.LENGTH_SHORT).show();
            return;
        }
        // 开启蓝牙
        mBluetoothAdapter.enable();
        // 初始化通知栏
        // ScanningDeviceUtils.initNotify();
        scanLeDevice(true);
    }

    /**
     * 扫描设备
     *
     * @param enable
     */
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
    private static void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mScanning = true;
//            mBluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
//            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
    }

//    // 蓝牙扫描回调
//    private static BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter().LeScanCallback()
//
//    {
//
//        @Override
//        public void onLeScan (BluetoothDevice device, int rssi, byte[] scanRecord){
//        final iBeaconClass.iBeacon ibeacon = iBeaconClass.fromScanData(device, rssi,
//                scanRecord);
//        if (ibeacon != null) {
//            Intent intent0 = new Intent("com.DeviceScanActivity.receiver");
//            intent0.putExtra("BluetoothReceiver", true);
//            intent0.putExtra("Bluetooth_ibeacon", ibeacon);
//            mContext.sendBroadcast(intent0);
//            //				Log.d("log", ibeacon.toString());
//            // 请求网络
//            //				Log.e("ibe请求!!req","是否可以请求网络："+getIBeaconInfo(ibeacon, false));
//            if (getIBeaconInfo(ibeacon, false)) {
//                networkRequest(ibeacon);
//            }
//        } else {
//            //				Log.d("log", "ibeacon为空");
//        }
//    }
//    }

    /**
     * 初始化通知栏
     */
    public static void initNotify() {
        /**
         * 初始化要用到的系统服务
         */
        mNotificationManager = (NotificationManager) mContext
                .getSystemService(Context.NOTIFICATION_SERVICE);
        mBuilder = new NotificationCompat.Builder(mContext);
        mBuilder.setContentTitle("您附近有个艺术家")
                .setContentText("您附近有个艺术家")
                .setContentIntent(
                        getDefalutIntent(Notification.FLAG_AUTO_CANCEL))
                // .setNumber(number)//显示数量
                .setTicker("您附近有个艺术家")// 通知首次出现在通知栏，带上升动画效果的
                .setWhen(System.currentTimeMillis())// 通知产生的时间，会在通知信息里显示
                .setPriority(Notification.PRIORITY_DEFAULT)// 设置该通知优先级
                // .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消
                .setOngoing(false)// ture，设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
                .setDefaults(Notification.DEFAULT_VIBRATE)// 向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置，使用defaults属性，可以组合：
                // Notification.DEFAULT_ALL Notification.DEFAULT_SOUND 添加声音 //
                // requires VIBRATE permission
                .setSmallIcon(R.mipmap.icon05);
    }

    /**
     * @获取默认的pendingIntent,为了防止2.3及以下版本报错
     * @flags属性: 在顶部常驻:Notification.FLAG_ONGOING_EVENT 点击去除：
     * Notification.FLAG_AUTO_CANCEL
     */
    public static PendingIntent getDefalutIntent(int flags) {
        PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 1,
                new Intent(), flags);
        return pendingIntent;
    }

    /**
     * 显示通知栏
     */
    public static void showNotify(int notificationNum) {
        // Notification.FLAG_ONGOING_EVENT --设置常驻
        // Flag;Notification.FLAG_AUTO_CANCEL 通知栏上点击此通知后自动清除此通知
        // notification.flags = Notification.FLAG_AUTO_CANCEL;
        // //在通知栏上点击此通知后自动清除此通知
        mBuilder.setAutoCancel(true)
                // 点击后让通知将消失
                .setContentTitle("您附近有个艺术家")
                .setContentText("您附近有" + notificationNum + "个艺术家")
                // 通知首次出现在通知栏，带上升动画效果的
                .setTicker("您附近有" + notificationNum + "个艺术家");
        // 点击的意图ACTION是跳转到Intent
        Intent resultIntent = new Intent(mContext, DeviceScanActivity.class);
        resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0,
                resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(pendingIntent);
        mNotificationManager.notify(100, mBuilder.build());
    }

    /**
     * 得到保存的IBeacon信息
     */
    static IBeaconBean miBeaconBean;

    private static Boolean getIBeaconInfo(iBeaconClass.iBeacon ibeacon, Boolean isSave) {
        Gson gson = new Gson();
        miBeaconBean = new IBeaconBean();
        List<IBeaconBean.IBeaconData> list = new ArrayList<IBeaconBean.IBeaconData>();
        //		Log.d("log", "进入getIBeaconInfo");
        if ("".equals(MySharedPreferences.getMySharedPreferences(mContext)
                .getValue("IBeaconInfo", ""))) {
            IBeaconBean.IBeaconData data = new IBeaconBean.IBeaconData();
            // 判断是否存在保存的信息,如果不存在将第一次保存
            data.setBluetoothAddress(ibeacon.bluetoothAddress);
            data.setData(new Date().getTime());
            data.setMajor(ibeacon.major);
            data.setMinor(ibeacon.minor);
            data.setName(ibeacon.name);
            data.setProximityUuid(ibeacon.proximityUuid);
            data.setRssi(ibeacon.rssi);
            data.setTxPower(ibeacon.txPower);
            list.add(data);
            miBeaconBean.setData(list);
            if (isSave) {
                MySharedPreferences.getMySharedPreferences(mContext).setValue(
                        "IBeaconInfo", gson.toJson(miBeaconBean));
                //				Log.d("log", "第一次保存后Ibeacon："+ gson.toJson(miBeaconBean).toString());
            }
            // showNotify(notificationNum++);
        } else {
            miBeaconBean = gson.fromJson(
                    MySharedPreferences.getMySharedPreferences(mContext)
                            .getValue("IBeaconInfo", ""), IBeaconBean.class);
            //			Log.d("log", "已进入已存在保存的消息" + miBeaconBean.getData().size());
            for (int i = 0; i < miBeaconBean.getData().size(); i++) {
                if (!isToday(miBeaconBean.getData().get(i).getData())) {
                    if (isSave) {
                        // 不是同一天的Ibeacon信息就全部删除
                        if (miBeaconBean.getData().size() == 1) {
                            // 判断是否就一条消息,如果就一条就直接清空
                            MySharedPreferences
                                    .getMySharedPreferences(mContext).setValue(
                                    "IBeaconInfo", "");
                        } else {
                            // 如果为多条就删除其中一条就行
                            miBeaconBean.getData().remove(i);
                        }
                        //						Log.d("log","不是同一天删除后的信息 : "+ MySharedPreferences.getMySharedPreferences(mContext).getValue("IBeaconInfo", ""));
                    }
                } else {
                    //					Log.d("log", "当天的Ibeacon信息相同不推送了");
                    return false;
                }
            }
            // 发送Ibeacon消息
            // showNotify(notificationNum++);
            // 保存当前记录或则是删除后的记录
            IBeaconBean.IBeaconData data = new IBeaconBean.IBeaconData();
            data.setBluetoothAddress(ibeacon.bluetoothAddress);
            data.setData(new Date().getTime());
            data.setMajor(ibeacon.major);
            data.setMinor(ibeacon.minor);
            data.setName(ibeacon.name);
            data.setProximityUuid(ibeacon.proximityUuid);
            data.setRssi(ibeacon.rssi);
            data.setTxPower(ibeacon.txPower);
            list.add(data);
            miBeaconBean.setData(list);
            if (isSave) {
                MySharedPreferences.getMySharedPreferences(mContext).setValue(
                        "IBeaconInfo", gson.toJson(miBeaconBean));
                //				Log.d("log", "保存后的Ibeacon："+ gson.toJson(miBeaconBean).toString());
            }
        }
        return true;
    }

    static Boolean isReqIng = false;

    /**
     * 这里写请求网络
     */
    public static void networkRequest(final iBeaconClass.iBeacon ibeacon) {
//		// 请求成功之后
//
//
//		if (!isReqIng) {
//			isReqIng = true;
//			Log.e("ibe请求!!req","开始骑牛");
//			HttpPost request = new HttpPost(Cache.ibeaconScanning);
//			// 先封装一个 JSON 对象
//			try {
//				JSONArray jsarr = new JSONArray();
//
//				for (int i = 0; i < miBeaconBean.getData().size(); i++) {
//					JSONObject item = new JSONObject();
//					IBeaconBean.IBeaconData data = miBeaconBean.getData().get(i);
//					item.put("Major", String.valueOf(data.getMajor()));
//					item.put("Minor", String.valueOf(data.getMinor()));
//					item.put("UUID", data.getProximityUuid());
//					jsarr.put(item);
//				}
//
//				JSONObject param = new JSONObject();
//
//				if (TextUtils.isEmpty(AppUtil.getUser().getToken())) {
//					param.put("device_tokens", MainActivity.UmToken);
//					param.put("client_type", "1");
//				} else {
//					param.put("token", AppUtil.getUser().getToken());
//				}
//				param.put("data", jsarr);
//				// 绑定到请求 Entry
//				//				StringEntity se = new StringEntity(param.toString());
//				//				param = new JSONObject();
//				//				param.put("mobile", "18610720660");
//				request.addHeader("Accept", "application/json, text/javascript, */*");
//				StringEntity test = new StringEntity(param.toString());
//				request.setEntity(test);
//
//				Log.e("ibe请求!请求参数",param.toString());
//				// 发送请求
//				HttpResponse httpResponse = new DefaultHttpClient()
//				.execute(request);
//				// 得到应答的字符串，这也是一个 JSON 格式保存的数据
//				String retSrc = EntityUtils.toString(httpResponse
//						.getEntity());
//				// 生成 JSON 对象
//				JSONObject result = new JSONObject(retSrc);
//				Log.d("ibe请求结果", retSrc);
//				String ret = result.optString("ret");
//				if (ret.equals("0")) {
//					isReqIng = false;
//					getIBeaconInfo(ibeacon, true);
//				}
//
//				// String token = result.get("token");
//			} catch (Exception e) {
//				// TODO: handle exception
//			}
//			//			thread.start();
//
//
//		}
//
//		//
    }

    /**
     * 判断给定字符串时间是否为今日
     */
    public static boolean isToday(long sdate) {
        int curyear = Calendar.getInstance().get(Calendar.YEAR);
        int curdays = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
        Date date = new Date(sdate);
        GregorianCalendar gregorianCalendar = new GregorianCalendar();
        gregorianCalendar.setTime(date);
        int year = gregorianCalendar.get(Calendar.YEAR);
        int days = gregorianCalendar.get(Calendar.DAY_OF_YEAR);
        return curyear == year && curdays == days;
    }
}
